/** 推理模型 是否可用 */
let isReasoningConnected = false;
/** 嵌入模型 是否可用 */
let isEmbeddingConnected = false;
/** 视觉模型 是否可用 */
let isVisualConnected = false;
/** 用于中断请求的控制器（如 API 请求） */
let abortController = null;
/** 当前语音引擎类型 */
let currentSpeechEngineType = "custom";
/** 可用的系统语言模型列表 */
let availableVoices = [];
/** 与推理模型的聊天历史记录 */
let conversationHistory = [];
/** 语音合成对象 */
let speechSynthesis = window.speechSynthesis;
/** 当前语音合成任务对象 */
let currentSpeech = null;
/** 当前音频对象 */
let currentAudio = null;
/** 保存Lunara配置 */
let savedLunaraConfigs = {};
/** 当前配置名称 */
let currentConfigName = "";
/** 定义 PIXI 应用程序实例，用于管理 Live2D 模型的渲染和显示 */
let pixiJSExample = null;
/** 定义 Live2D 模型实例，用于存储当前加载的 Live2D 模型 */
let Live2DExample = null;
/** 当前正在使用的 Live2D 模型 */
let currentLive2DModel = null;
/** 当前情绪状态 */
let currentEmotionState = EmotionalState.IDLE;
/** 小屏幕宽度阈值 */
const SMALL_SCREEN_WIDTH_THRESHOLD = 475;
/** 防抖延迟时间（毫秒），用于控制防抖函数的触发间隔 */
const DEBOUNCE_DELAY = 200;
/** 用于存储窗口大小调整时的定时器 ID，用于防抖操作 */
let resizeTimerId;
/** 配置面板选项 */
let configurePanelOption = 'any';
/** 支持的图片文件扩展名 */
const imageFormatsExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff'];
/** 支持的视频文件扩展名 */
const videoFormatsExtensions = ['mp4', 'avi', 'mov', 'mkv', 'flv', 'wmv'];
/** 支持的视觉文件扩展名 */
const visionExtensions = [...imageFormatsExtensions, ...videoFormatsExtensions];
/** 通过文件扩展名判断文件是否为支持的类型 */
const fileValidExtensions = [
	// 纯文本文件
	'.txt', '.md', '.log', '.ini', '.conf',
	// 常见代码文件
	'.js', '.jsx', '.ts', '.tsx', '.py', '.java', '.c', '.cpp', '.h',
	'.cs', '.php', '.rb', '.go', '.rs', '.swift', '.kt', '.dart',
	// 数据格式文件
	'.json', '.csv', '.xml', '.yaml', '.yml',
	// 标记语言和样式文件
	'.html', '.htm', '.css', '.scss', '.less', '.sass', '.styl',
	// 配置文件
	'.env', '.properties', '.toml',
	// 常见图片文件和视频文件
	...visionExtensions
];
/** 通过文件的 MIME 类型判断文件是否为支持的类型 */
const fileValidTypes = [
	'application/json',  // JSON 数据格式
	'application/xml',   // XML 数据格式
	'application/x-yaml' // YAML 数据格式
];
/** 是否自动播放语音 */
let autoPlaySpeech = true;
/** 是否正在拖拽文件，初始值为 false */
let isFileDragging = false;
/** 延迟执行标识符 */
const delayExecutionMap = new Map();
/** 是否启用 开发者模式 */
let isDeveloperMode = false;
/** 是否启用 长期记忆模式 */
let isLongTermMemoryMode = false;
/** 是否启用 主动消息模式 */
let isActiveMessageMode = false;
/** 用于存储系统消息显示的定时器 ID，初始化为 null */
let systemMessageTimer = null;
/** 系统消息队列，用于存储待显示的消息 */
let systemMessageQueue = [];
/** 禁用语音识别自动发送 */
let isDisableVoiceRecognition = false;
/** 记录上一次显示预设消息的时间戳，初始值为 0 */
let lastPresetMessageTime = 0;
/** 二维码定时器 ID */
let qrcodeTimerId = null;
/** 已完成下载的文件历史记录，用于避免重复处理 */
const completeDownloadHistory = new Set();
/** 聊天记录元数据版本 */
const chatHistoryMetaVersion = new Set(['2025-07-20', '2025-08-30']);